//
//  HMHomeDAL.swift
//  HMVVeibo23
//
//  Created by apple on 17/2/13.
//  Copyright © 2017年 apple. All rights reserved.
//

import UIKit
/*
    - 数据处理层
        - 作用
            - 保存数据
            - 读取数据
                - 判断
                    - 如果本地有 直接从本地读取
                    - 如果本地没有 从网络下载 然后保存到本地
            - 删除数据
 */
/*
 CREATE TABLE IF NOT EXISTS "T_home" (
 "userid" INTEGER NOT NULL,
 "statusid" INTEGER NOT NULL,
 "status" TEXT,
 "createtime" TEXT DEFAULT (datetime('now','localtime')),
 PRIMARY KEY("userid","statusid")
 )
 */
class HMHomeDAL: NSObject {
    // 通过时间判断删除本地缓存数据 
    // 什么时候开始删除本地数据 -> 当程序退到后台的时候
    // 2017-02-13 17:00:26
    // 2017-02-13 17:02:26
    class func deleteCache(){
        // 获取当前的时间
        var date = Date()
        // 删除 17点之前的数据
        date.addTimeInterval(-60*35)
        // 实例化时间格式化
        let df = DateFormatter()
        // 指定格式
        df.dateFormat = "yyyy-MM-dd HH:mm:ss"
        // 时间字符串
        let timeStr = df.string(from: date)
        // 准备sql
        let sql = "DELETE FROM T_home WHERE createtime<'\(timeStr)'"
        // 执行sql
        HMSQLManager.shared.queue?.inDatabase({ (db) in
            let result = db?.executeUpdate(sql, withArgumentsIn: nil)
            if result == false {
                print("删除本地数据失败")
            }else {
                print("删除本地数据成功","删除多少条",db?.changes())
            }
        })
    }
    
    // 判断从本地加载还是从网络获取
    class func checkCache(sinceId: Int64, maxId: Int64, callback:@escaping ([[String : Any]]?)->()){
        // 获取本地数据
        let result = HMHomeDAL.getCache(sinceId: sinceId, maxId: maxId)
        // 判断本地是否有数据
        if result.count > 0 {
            print("本地数据")
            callback(result)
        }else {
            // 获取的是网络数据
            print("网络数据")
            // 进行网络请求
            HMNetworkTools.shared.loadHomeData(since_id: sinceId, max_id: maxId, success: { (response) in
                
                // 判断response 是否为nil 而且是否可以转成字典
                guard let resDict = response as? [String: Any] else {
                    // 执行闭包
                    callback(nil)
                    return
                }
                //resDict["statuses"] 是否为nil(数组)
                guard let res = resDict["statuses"] as? [[String: Any]] else {
                    // 执行闭包
                    callback(nil)
                    return
                }
                // 把数据返回到HomeViewModel中
                callback(res)
                // 保存数据到本地
                HMHomeDAL.saveCache(res: res)
                
            }, failure: { (error) in
                print("请求失败",error)
                callback(nil)
            })
            
        }
        
    }
    
    // 读取数据
    class func getCache(sinceId: Int64, maxId: Int64) -> [[String: Any]]{
        // 获取userId
        let userId = HMOAuthViewModel.shared.userAccountModel?.uid
        // 准备sql
        var sql = ""
        sql += "SELECT * FROM T_home\n"
        sql += "WHERE userid=\(userId!)\n"
        // 下拉刷新
        if sinceId > 0 {
            sql += "AND statusid>\(sinceId)\n"
        }
        // 上拉加载更多
        if maxId > 0 {
            sql += "AND statusid<\(maxId)\n"
        }
        sql += "ORDER BY statusid DESC\n"
        sql += "LIMIT 20"
        
        // 执行sql
        let result = HMSQLManager.shared.selectDataWith(sql: sql)
        // 创建一个临时可变的数组
        var tempArray:[[String: Any]] = [[String: Any]]()
        // 遍历result
        for dic in result{
            let statusData = dic["status"] as! Data
            // 二进制转成字典
            let statusDict = try! JSONSerialization.jsonObject(with: statusData, options: []) as! [String: Any]
            // 添加到数组中
            tempArray.append(statusDict)
        }
        return tempArray
    }
    
    //保存数据
    class func saveCache(res: [[String: Any]]){
        // 获取userId
        let userId = HMOAuthViewModel.shared.userAccountModel?.uid
        // 准备sql(如果数据中没有 直接添加 如果有 替换掉原来的数据)
        let sql = "INSERT OR REPLACE INTO T_home (userid,statusid,status) VALUES (?,?,?)"
        // 执行sql
        HMSQLManager.shared.queue?.inTransaction({ (db, rollback) in
            // 循环数组
            for dic in res {
                // 获取微博的id
                let statusId = dic["id"] as! Int64
                // 转成二进制
                let statusData = try! JSONSerialization.data(withJSONObject: dic, options: [])
                let result = db?.executeUpdate(sql, withArgumentsIn: [userId!,statusId,statusData])
                if result == false {
                    print("保存数据失败")
                    // 回滚
                    rollback?.pointee = true
                    return
                }else {
                    print("保存数据成功")
                }
            }
        })
        
    }
}
